package com.cqjtu.store.user.controller;

import com.cqjtu.store.common.JwtUtils;
import com.cqjtu.store.common.PageVO;
import com.cqjtu.store.common.R;
import com.cqjtu.store.product.pojo.dto.ProductCategoryPageDTO;
import com.cqjtu.store.user.pojo.dto.*;
import com.cqjtu.store.user.pojo.vo.UserLoginVO;
import com.cqjtu.store.user.pojo.vo.UserShowVO;
import com.cqjtu.store.user.pojo.vo.UserVO;
import com.cqjtu.store.user.service.UserService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Param;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

/**
 * @ProjectName: cqjtu-store
 * @Titile: UserController
 * @Author: Lucky
 * @Description: 用户控制类
 */
@RestController
@RequestMapping("user") //一级
@Slf4j
@Api(tags = "用户模块")
@CrossOrigin
public class UserController {
    @Autowired
    private UserService userService;
    // localhost:port/user/reg
    @PostMapping("reg")//二级
    @ApiOperation("用户注册接口")
    public R<Void> register(@RequestBody @Validated UserRegDTO userRegDTO){
        log.debug("用户注册信息：{}",userRegDTO);
        userService.register(userRegDTO);
        System.out.println("注册");
        return R.ok();
    }

    @PostMapping("login")
    @ApiOperation("用户登录接口")
    public R<UserLoginVO> login(@RequestBody UserLoginDTO userLoginDTO){
        log.debug("用户登录信息:{}",userLoginDTO);
        R<UserLoginVO> userLoginVO =  userService.login(userLoginDTO);
        return userLoginVO;
    }

    /**
     * 修改密码
     * @param pwdUpdateDTO
     * @return
     */
    @PutMapping("pwd/update")
    @ApiOperation("用户修改密码接口")
    public R<Void> updatePwd(@RequestBody PwdUpdateDTO pwdUpdateDTO,
                             HttpServletRequest request){
        log.debug("修改的密码信息:{}",pwdUpdateDTO);
        //获取用户的身份：请求头中是含有token的
        String token = request.getHeader("Authorization");
        //解析token：知道用户的身份
        UserLoginVO loinUser = JwtUtils.parseToken(token);
        //知道了是谁在修改密码
        userService.updatePwd(pwdUpdateDTO,loinUser);
        return R.ok();
    }
    @GetMapping("info")
    @ApiOperation("查看用户信息接口")
    public R<UserVO> getUser(HttpServletRequest request){
        //获取用户信息
        String token = request.getHeader("Authorization");
        UserLoginVO userLoginVO = JwtUtils.parseToken(token);
        UserVO userVO =  userService.getUser(userLoginVO);
        return R.ok(userVO);
    }
    @PutMapping("update")
    @ApiOperation("修改用户信息接口")
    public R<Void> udapteUser(@RequestBody UserUpdateDTO userUpdateDTO,HttpServletRequest request){
        log.debug("用户修改的信息:{}",userUpdateDTO);
        //获取修改人
        String token = request.getHeader("Authorization");
        UserLoginVO userLoginVO = JwtUtils.parseToken(token);
        userService.updateUser(userUpdateDTO,userLoginVO);
        return R.ok();
    }

    /**
     * 文件上传
     * @param avatar
     * @param request
     * @return
     */
    // todo 在线文档注解
    @PostMapping("avatar")
    public R<Void> uploadAvatar(MultipartFile avatar,HttpServletRequest request){
        //获取用户
        String token = request.getHeader("Authorization");
        UserLoginVO userLoginVO = JwtUtils.parseToken(token);
        // 文件上传，把头像的路径保存在数据库
        userService.upload(avatar,userLoginVO);
        return R.ok();
    }
    @PostMapping("logout")
    public R<Void> logout(){
        // 后台清空token
        //前端处理：只要用户退出，前端就会让用户页面跳转到登录界面，并且清空用户的本地存储（清除token）
        //后端处理：在企业实践中，会将token存储在一个缓存介质（redis，mcache等），只要用户退出，就会在缓冲中清空token。
        return R.ok();
    }
    //新增用户
    @PostMapping("add")//二级
    @ApiOperation("新增用户接口")
    public R<Void> addUser(@RequestBody @Validated UserUpdateDTO userUpdateDTO){
        log.debug("新增用户信息：{}",userUpdateDTO);
        userService.addUser(userUpdateDTO);
        System.out.println("新增");
        return R.ok();
    }

    /**
     * 设置用户账号禁用状态
     * @param id 用户编号
     * @param
     * @return
     */
    @PutMapping("stop/{id}") // setDefault?id=1001  =>setDefault/1001
    public R<Void> stopUser(@PathVariable Integer id){
        userService.stopUser(id);
        System.out.println("修改用户账号停用状态");
        return R.ok();
    }
    /**
     * 设置用户账号启用状态
     * @param id 用户编号
     * @param
     * @return
     */
    @PutMapping("start/{id}") // setDefault?id=1001  =>setDefault/1001
    public R<Void> start(@PathVariable Integer id){
        userService.startUser(id);
        System.out.println("修改用户账号启用状态");
        return R.ok();
    }
    /**
     * 重置用户密码
     * @param id 用户编号
     * @param
     * @return
     */
    @PutMapping("reset/{id}") // setDefault?id=1001  =>setDefault/1001
    public R<Void> resetUser(@PathVariable Integer id){
        userService.resetUser(id);
        System.out.println("重置用户密码");
        return R.ok();
    }
    //查询所有用户
    @PostMapping("show")
    @ApiOperation("查看所有用户信息接口")
    public R<PageVO<List<UserShowVO>>> showUserList(@RequestBody(required=false) UserPageDTO userPageDTO){
        //获取用户信息
        PageVO<List<UserShowVO>> userShowVOList =  userService.showUserList(userPageDTO);
        return R.ok(userShowVOList);
    }
    //按用户名查询用户
    @PostMapping("showByName")
    @ApiOperation("根据用户名查看用户信息接口")
    public R<PageVO<List<UserShowVO>>> showUserByNameList(@RequestParam String username,@RequestBody @Validated UserPageDTO userPageDTO){
        //获取用户信息
        System.out.println(username);
        PageVO<List<UserShowVO>> userShowVOList =  userService.showUserByNameList(username,userPageDTO);
        return R.ok(userShowVOList);
    }



}
